// 普通方法，target 对应的是类的 prototype
// 静态方法，target 对应的是类的构造函数

// 方法的装饰器是在方法定义之后就执行
// 方法的装饰器接收的参数是target、key 和 descriptor
// 这里面的target、key 和 descriptor 和 Object.defineProperty(obj, prop, descriptor) 的 obj、prop 和 descriptor 很像
// 分别是哪个对象，哪个属性，具体描述配置
function getNameDecorator(target: any, key: string, descriptor: PropertyDescriptor) {
  console.log(target, key);
  // 方法不可被重写
  descriptor.writable = true;
  // 对所装饰的方法进行了变更
  descriptor.value = function() {
    return 'decorator';
  };
}

class Test {
  name: string;
  constructor(name: string) {
    this.name = name;
  }
  @getNameDecorator
  getName() {
    return this.name;
  }
}

const test = new Test('dell');
console.log(test.getName());
